import java.util.Stack;
public class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    public MinStack() {//构造方法
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);//普通栈中压入值
        if(minStack.empty()) {//判断最小栈是否为空，为空，压入值
            minStack.push(val);
        }else {//如果最小栈中有值
            if (val <= minStack.peek()) {//如果val小于等于最小栈的栈顶元素
                minStack.push(val);
            }
        }
    }

    public void pop() {
        if(!stack.empty()){//若普通栈不为空，才能将栈中元素弹出
            int val = stack.pop();//这里发生了拆箱，数值范围扩大，在下面比较的时候可以直接使用==，若val是Integer类型是，可以使用equals来比较
            //维护最小栈
            if(val == minStack.peek()) {
                minStack.pop();
            }
        }
    }
    //这个方法就是查看栈中的元素
    public int top() {
        if(!stack.empty()) {//栈不为空，进入
            return stack.peek();//返回查看到的栈顶元素
        }
        return -1;//栈为空，返回-1
    }

    public int getMin() {
        return minStack.peek();//获取最小元素，直接返回最小栈的栈顶元素
    }
}
